package project.web.generic;

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import net.arnx.jsonic.JSON;
import online.model.check.InputCheck;
import online.struts.action.RestAction;
import online.struts.action.UniForm;

import org.apache.logging.log4j.LogManager;

import project.check.range.LengthRangeCheck;
import project.svc.generic.QueryService;
import project.web.InstanceFactory;
import core.exception.LogicalException;

/**
 * 選択候補アクション
 *
 * @author Tadashi Nakayama
 * @version 1.0.0
 */
public final class SuggestAction extends RestAction {

	/**
	 * 取得処理
	 *
	 * @param model 汎用データモデル
	 * @param response レスポンス
	 * @return 処理結果
	 */
	public String get(final UniForm model, final HttpServletResponse response) {
		if (!model.hasQueryString()) {
			throw new LogicalException(HttpServletResponse.SC_BAD_REQUEST);
		}

		// 入力チェック
		checkInput(model);

		//DB情報取得
		QueryService ql = InstanceFactory.create(QueryService.class, model);
		if (!ql.search()) {
			throw new LogicalException(HttpServletResponse.SC_NOT_FOUND);
		}

		try {
			response.setContentType("application/json; charset=UTF-8");

			JSON.encode(ql.getResultModel().getStringArray("Value"), response.getWriter());

			response.flushBuffer();
		} catch (final IOException ex) {
			LogManager.getLogger().info(ex.getMessage());
		}

		return null;
	}

	/**
	 * 入力チェック
	 *
	 * @param model 汎用モデル
	 */
	private void checkInput(final UniForm model) {
		InputCheck ic = InstanceFactory.create(InputCheck.class, model);
		for (final String item : model.getActionParameter().getParameterKeySet()) {
			ic.add(item, new LengthRangeCheck(0, 24));
		}
		ic.populate();
	}
}
